//package com.bj58.ep.cooperate.docsws.server.context;
//
//import com.bj58.ep.cooperate.docsws.server.entity.out.RequestMessage;
//import lombok.extern.slf4j.Slf4j;
//
//import java.util.*;
//import java.util.concurrent.ConcurrentHashMap;
//
///**
// * @author lifudong
// */
//@Slf4j
//public class OutMessageContainer {
//
//    private static final int MAX_CAPACITY = 1000;
//
//    private static final int MAX_RETRY_TIMES = 3;
//
//    private final Map<String, Message> map = new ConcurrentHashMap<>();
//
//    private final List<String> list = new LinkedList<>();
//
//    private static class Message {
//        private final RequestMessage<?> message;
//        private int sendTimes;
//
//        Message(RequestMessage<?> message, int sendTimes) {
//            this.message = message;
//            this.sendTimes = sendTimes;
//        }
//    }
//
//    public void remove(String msgId) {
//        map.remove(msgId);
//        list.remove(msgId);
//    }
//
//    public void add(RequestMessage<?> message) {
//        if (SubscribeHolder.sendRetry(message.getBzId())) {
//            if (list.size() >= MAX_CAPACITY) {
//                list.remove(0);
//            }
//            list.add(message.getMsgId());
//            map.put(message.getMsgId(), new Message(message, 1));
//        }
//    }
//
//    public void addTimes(String msgId) {
//        Message message = map.get(msgId);
//        message.sendTimes = message.sendTimes + 1;
//    }
//
//    public RequestMessage<?> getMessage(String msgId) {
//        return map.get(msgId).message;
//    }
//
//    public void loopDeal(MessageDeal messageDeal) {
//        if (list.isEmpty()) return;
//        List<String> deletes = new ArrayList<>();
//        for (String msgId : list) {
//            Message message = map.get(msgId);
//            messageDeal.deal(message.message);
//            this.addTimes(msgId);
//            if (message.sendTimes > MAX_RETRY_TIMES) {
//                deletes.add(msgId);
//            }
//        }
//        for (String msgId : deletes) {
//            remove(msgId);
//        }
//    }
//
//    @FunctionalInterface
//    public interface MessageDeal {
//        void deal(RequestMessage<?> requestMessage);
//    }
//}
